import time

from django.shortcuts import render
from redis.commands.search.reducers import count
from django.db.models import Count # 执行数据分组的模块
from utils.pagination import Pagination
from web import models
from web.forms.issues import IssuesModelForm, IssuesReplyModelForm,InviteModelForm
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from django.urls import reverse
import json
from django.utils.safestring import mark_safe
from utils.encrypt import uid
import datetime


def dashboard(request,project_id):
    """ 概览 """
    status_dict = {}
    for key,text in models.Issues.status_choices:
        status_dict[key] = {'text':text,'count':0}
    # 字典的数据格式：{1: {'text': '新建', 'count': 0}, 2: {'text': '处理中', 'count': 0}, 3: {'text': '已解决', 'count': 0},
    # 4: {'text': '已忽略', 'count': 0}, 5: {'text': '待反馈', 'count': 0}, 6: {'text': '已关闭', 'count': 0},
    # 7: {'text': '重新打开', 'count': 0}}
    # 问题数据的处理。.values('status')：是根据status来进行分组，
    #  .annotate(ct=Count('id'))：根据分组后数据的id计算分组后的每组中的数量，并把数量赋值给变量ct
    # issues_data的数据格式为：<QuerySet [{'status': 1, 'ct': 10}, {'status': 6, 'ct': 1}, {'status': 2, 'ct': 2}]>
    issues_data = models.Issues.objects.filter(project_id=project_id).values('status').annotate(ct=Count('id'))
    # 把分组好的数据写入到建立的字典中
    for item in issues_data:
        # 把循环出来字典中ct的数据，根据status的数值写入到构造的字典中
        status_dict[item['status']]['count'] = item['ct']

    # 项目的参与者。.values_list('user_id','user__username')只在表中查询参数代表的列，并且用 __ 进行外键表的跨表查询
    user_list = models.ProjectUser.objects.filter(project_id=project_id).values_list('user_id','user__username')

    # 显示最近的10个问题。根据id的倒序查询最近的问题，并且让指派的字段assign不为空才显示
    top_ten = models.Issues.objects.filter(project_id=project_id,assign__isnull=False).order_by('-id')[0:10]

    context = {
        'status_dict':status_dict,
        'user_list':user_list,
        'top_ten_object':top_ten,
    }
    return render(request,'web/dashboard.html',context)


# 图表展示函数
def issues_chart(request,project_id):
    """ highcharts中展示图表用的数据 """
    # 例如要求是展示30天的数据
    # 先获取当前时间，再根据当前时间往前推30天，并把这些数据全部获取到
    today = datetime.datetime.now().date()
    date_dict = {} # {'2025-03-11': [1741622400000.0, 0], '2025-03-10': [1741536000000.0, 0]}
    for i in range(0,30):
        date = today - datetime.timedelta(days=i)
        date_dict[date.strftime('%Y-%m-%d')] = [time.mktime(date.timetuple()) * 1000, 0]
    # today-datetime.timedelta(days=30):当前时间减去30天，即30天前的时间。create_datetime__gte= ： 创建时间大于等于30天前的时间即，获取的数据是30天
    # 字符串格式化 sqlite：strftime("%%Y-%%m-%%d",web_issues.create_datetime)
    # 字符串格式化 mysql：DATE_FORMAT(web_issues.create_datetime,"%%Y-%%m-%%d")
    # models.Issues.objects.filter(project_id=project_id,create_datetime__gte=today-datetime.timedelta(days=30)).extra(
    #     select={'ctime':'strftime("%%Y-%%m-%%d",web_issues.create_datetime)'}
    # ).values('ctime').annotate(ct=Count('id'))
    result = models.Issues.objects.filter(project_id=project_id,create_datetime__gte=today-datetime.timedelta(days=30)).extra(
        select={'ctime':'DATE_FORMAT(web_issues.create_datetime,"%%Y-%%m-%%d")'}
    ).values('ctime').annotate(ct=Count('id')) # 数据格式为列表中的一个个的字典[{'ctime': '2025-02-26', 'ct': 12}, {'ctime': '2025-03-05', 'ct': 1}]

    for item in result:
        date_dict[item['ctime']][1] = item['ct']

    return JsonResponse({'status':True,'data':list(date_dict.values())})


































